{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from metadsl import *\n",
    "from metadsl_core import *\n",
    "from metadsl_llvm.pure import *\n",
    "\n",
    "import metadsl_visualize\n",
    "\n",
    "import typez\n",
    "typez.SHOW_TYPES = False\n",
    "\n",
    "# Disable fixed point expansion temporarily\n",
    "run_post_rules(False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "one = Integer.from_int(1)\n",
    "zero = Integer.from_int(0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# mod = Module.create(\"Main\")\n",
    "\n",
    "@FunctionThree.from_fn_recursive\n",
    "def fib_more(\n",
    "    fn: FunctionThree[Integer, Integer, Integer, Integer],\n",
    "    n: Integer,\n",
    "    a: Integer,\n",
    "    b: Integer,\n",
    ") -> Integer:\n",
    "    pred_cont = n > one\n",
    "    minus1 = n - one\n",
    "    ab = a + b\n",
    "    added = fn(minus1, b, ab)\n",
    "\n",
    "    n_eq_1 = n.eq(one)\n",
    "    return pred_cont.if_(added, n_eq_1.if_(b, a))\n",
    "\n",
    "# res = mod.register_function_three(fib_more)\n",
    "# mod, fib_more_ref = res.left(), res.right()\n",
    "\n",
    "@FunctionOne.from_fn\n",
    "def fib(n: Integer) -> Integer:\n",
    "    return fib_more(n, zero, one)\n",
    "\n",
    "\n",
    "# res = mod.register_function_one(fib)\n",
    "# mod, fib_ref = res.left(), res.right()\n",
    "\n",
    "# fib_ref.to_fn()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/x.typez+json": {
       "nodes": {
        "-1537352240565790994": [
         "5",
         {
          "args": [
           "992639792148027798"
          ],
          "function": "Abstraction.fix"
         }
        ],
        "-1904840065120623779": [
         "13",
         {
          "args": [
           "1699684935501189025",
           "6726888453725805922"
          ],
          "function": "Abstraction.create",
          "type_params": {
           "T": {
            "type": "Integer"
           },
           "U": {
            "params": {
             "T": {
              "type": "Integer"
             },
             "U": {
              "type": "Integer"
             }
            },
            "type": "Abstraction"
           }
          }
         }
        ],
        "-2007108132401662645": [
         "4",
         {
          "args": [
           "-7152705137269109576",
           "-4917315558697447310"
          ],
          "function": "Abstraction.create",
          "type_params": {
           "T": {
            "params": {
             "T": {
              "type": "Integer"
             },
             "U": {
              "params": {
               "T": {
                "type": "Integer"
               },
               "U": {
                "params": {
                 "T": {
                  "type": "Integer"
                 },
                 "U": {
                  "type": "Integer"
                 }
                },
                "type": "Abstraction"
               }
              },
              "type": "Abstraction"
             }
            },
            "type": "Abstraction"
           },
           "U": {
            "params": {
             "T": {
              "type": "Integer"
             },
             "U": {
              "params": {
               "T": {
                "type": "Integer"
               },
               "U": {
                "params": {
                 "T": {
                  "type": "Integer"
                 },
                 "U": {
                  "type": "Integer"
                 }
                },
                "type": "Abstraction"
               }
              },
              "type": "Abstraction"
             }
            },
            "type": "Abstraction"
           }
          }
         }
        ],
        "-2013152151157931125": [
         "20",
         {
          "repr": "1",
          "type": "int"
         }
        ],
        "-2269790757109902385": [
         "9",
         {
          "args": [
           "3502814111171659379",
           "-2301422722903098161"
          ],
          "function": "Abstraction.create",
          "type_params": {
           "T": {
            "type": "Integer"
           },
           "U": {
            "params": {
             "T": {
              "type": "Integer"
             },
             "U": {
              "params": {
               "T": {
                "type": "Integer"
               },
               "U": {
                "type": "Integer"
               }
              },
              "type": "Abstraction"
             }
            },
            "type": "Abstraction"
           }
          }
         }
        ],
        "-2301422722903098161": [
         "13",
         {
          "args": [
           "1699684935501189025",
           "4530898577098197965"
          ],
          "function": "Abstraction.create",
          "type_params": {
           "T": {
            "type": "Integer"
           },
           "U": {
            "params": {
             "T": {
              "type": "Integer"
             },
             "U": {
              "type": "Integer"
             }
            },
            "type": "Abstraction"
           }
          }
         }
        ],
        "-3083040421012505767": [
         "19",
         {
          "args": [
           "-5471402790356054853"
          ],
          "function": "Abstraction.create_variable",
          "type_params": {
           "T": {
            "type": "Integer"
           },
           "U": {
            "type": "Integer"
           }
          }
         }
        ],
        "-3395452948088348766": [
         "4",
         {
          "args": [
           "555020173210289209"
          ],
          "function": "Abstraction.from_fn"
         }
        ],
        "-3560659222398345834": [
         "5",
         {
          "args": [
           "2827354755648773677"
          ],
          "function": "Abstraction.fix"
         }
        ],
        "-4126979823539692110": [
         "31",
         {
          "args": [
           "-8845129448963225019"
          ],
          "function": "FunctionThree.abstraction",
          "type_params": {
           "T": {
            "type": "Integer"
           },
           "U": {
            "type": "Integer"
           },
           "V": {
            "type": "Integer"
           },
           "X": {
            "type": "Integer"
           }
          }
         }
        ],
        "-4163701748216795396": [
         "4",
         {
          "args": [
           "-7152705137269109576",
           "1768970622270494201"
          ],
          "function": "Abstraction.create",
          "type_params": {
           "T": {
            "params": {
             "T": {
              "type": "Integer"
             },
             "U": {
              "params": {
               "T": {
                "type": "Integer"
               },
               "U": {
                "params": {
                 "T": {
                  "type": "Integer"
                 },
                 "U": {
                  "type": "Integer"
                 }
                },
                "type": "Abstraction"
               }
              },
              "type": "Abstraction"
             }
            },
            "type": "Abstraction"
           },
           "U": {
            "params": {
             "T": {
              "type": "Integer"
             },
             "U": {
              "params": {
               "T": {
                "type": "Integer"
               },
               "U": {
                "params": {
                 "T": {
                  "type": "Integer"
                 },
                 "U": {
                  "type": "Integer"
                 }
                },
                "type": "Abstraction"
               }
              },
              "type": "Abstraction"
             }
            },
            "type": "Abstraction"
           }
          }
         }
        ],
        "-4260278360339551966": [
         "29",
         {
          "args": [
           "8994880330752359122",
           "7076053915067089843",
           "9169923438897672122"
          ],
          "function": "Boolean.if_"
         }
        ],
        "-4731551208718647956": [
         "32",
         {
          "args": [
           "3502814111171659379",
           "4056229352954758995"
          ],
          "function": "Integer.__sub__"
         }
        ],
        "-4917315558697447310": [
         "9",
         {
          "args": [
           "555020325300721609"
          ],
          "function": "Abstraction.from_fn"
         }
        ],
        "-5467468638471633527": [
         "17",
         {
          "args": [
           "-3083040421012505767",
           "-4260278360339551966"
          ],
          "function": "Abstraction.create",
          "type_params": {
           "T": {
            "type": "Integer"
           },
           "U": {
            "type": "Integer"
           }
          }
         }
        ],
        "-5471402788872995603": [
         "14",
         {
          "repr": "0x7f8f20831cc0",
          "type": "Variable"
         }
        ],
        "-5471402790356054853": [
         "18",
         {
          "repr": "0x7f8f2083b160",
          "type": "Variable"
         }
        ],
        "-5471402790375540303": [
         "10",
         {
          "repr": "0x7f8f2083b780",
          "type": "Variable"
         }
        ],
        "-5714035107427050833": [
         "26",
         {
          "args": [
           "8545286856133305655",
           "8939703060706493622"
          ],
          "function": "Abstraction.__call__",
          "type_params": {
           "T": {
            "type": "Integer"
           },
           "U": {
            "type": "Integer"
           }
          }
         }
        ],
        "-6566385289152139753": [
         "5",
         {
          "args": [
           "-2007108132401662645"
          ],
          "function": "Abstraction.fix"
         }
        ],
        "-6930061660453938500": [
         "13",
         {
          "args": [
           "1699684935501189025",
           "-5467468638471633527"
          ],
          "function": "Abstraction.create",
          "type_params": {
           "T": {
            "type": "Integer"
           },
           "U": {
            "params": {
             "T": {
              "type": "Integer"
             },
             "U": {
              "type": "Integer"
             }
            },
            "type": "Abstraction"
           }
          }
         }
        ],
        "-6993459051533019229": [
         "1",
         {
          "args": [
           "-8193178092949280445",
           "5934196273650601297"
          ],
          "function": "FunctionThree.create",
          "type_params": {
           "T": {
            "type": "Integer"
           },
           "U": {
            "type": "Integer"
           },
           "V": {
            "type": "Integer"
           },
           "X": {
            "type": "Integer"
           }
          }
         }
        ],
        "-7152705137269109576": [
         "7",
         {
          "args": [
           "3751969246381808255"
          ],
          "function": "Abstraction.create_variable",
          "type_params": {
           "T": {
            "params": {
             "T": {
              "type": "Integer"
             },
             "U": {
              "params": {
               "T": {
                "type": "Integer"
               },
               "U": {
                "params": {
                 "T": {
                  "type": "Integer"
                 },
                 "U": {
                  "type": "Integer"
                 }
                },
                "type": "Abstraction"
               }
              },
              "type": "Abstraction"
             }
            },
            "type": "Abstraction"
           },
           "U": {
            "params": {
             "T": {
              "type": "Integer"
             },
             "U": {
              "params": {
               "T": {
                "type": "Integer"
               },
               "U": {
                "params": {
                 "T": {
                  "type": "Integer"
                 },
                 "U": {
                  "type": "Integer"
                 }
                },
                "type": "Abstraction"
               }
              },
              "type": "Abstraction"
             }
            },
            "type": "Abstraction"
           }
          }
         }
        ],
        "-7162770845206029801": [
         "5",
         {
          "args": [
           "-7177137270141030066"
          ],
          "function": "Abstraction.fix"
         }
        ],
        "-7177137270141030066": [
         "4",
         {
          "args": [
           "-7152705137269109576",
           "-2269790757109902385"
          ],
          "function": "Abstraction.create",
          "type_params": {
           "T": {
            "params": {
             "T": {
              "type": "Integer"
             },
             "U": {
              "params": {
               "T": {
                "type": "Integer"
               },
               "U": {
                "params": {
                 "T": {
                  "type": "Integer"
                 },
                 "U": {
                  "type": "Integer"
                 }
                },
                "type": "Abstraction"
               }
              },
              "type": "Abstraction"
             }
            },
            "type": "Abstraction"
           },
           "U": {
            "params": {
             "T": {
              "type": "Integer"
             },
             "U": {
              "params": {
               "T": {
                "type": "Integer"
               },
               "U": {
                "params": {
                 "T": {
                  "type": "Integer"
                 },
                 "U": {
                  "type": "Integer"
                 }
                },
                "type": "Abstraction"
               }
              },
              "type": "Abstraction"
             }
            },
            "type": "Abstraction"
           }
          }
         }
        ],
        "-7311685910498514272": [
         "4",
         {
          "args": [
           "-7152705137269109576",
           "2229741321625012437"
          ],
          "function": "Abstraction.create",
          "type_params": {
           "T": {
            "params": {
             "T": {
              "type": "Integer"
             },
             "U": {
              "params": {
               "T": {
                "type": "Integer"
               },
               "U": {
                "params": {
                 "T": {
                  "type": "Integer"
                 },
                 "U": {
                  "type": "Integer"
                 }
                },
                "type": "Abstraction"
               }
              },
              "type": "Abstraction"
             }
            },
            "type": "Abstraction"
           },
           "U": {
            "params": {
             "T": {
              "type": "Integer"
             },
             "U": {
              "params": {
               "T": {
                "type": "Integer"
               },
               "U": {
                "params": {
                 "T": {
                  "type": "Integer"
                 },
                 "U": {
                  "type": "Integer"
                 }
                },
                "type": "Abstraction"
               }
              },
              "type": "Abstraction"
             }
            },
            "type": "Abstraction"
           }
          }
         }
        ],
        "-7409043239914570800": [
         "0",
         {
          "repr": "<function fib_more at 0x7f8f208177b8>",
          "type": "function"
         }
        ],
        "-7669839280755447835": [
         "1",
         {
          "args": [
           "-8193178092949280445",
           "-3560659222398345834"
          ],
          "function": "FunctionThree.create",
          "type_params": {
           "T": {
            "type": "Integer"
           },
           "U": {
            "type": "Integer"
           },
           "V": {
            "type": "Integer"
           },
           "X": {
            "type": "Integer"
           }
          }
         }
        ],
        "-8126292564009571703": [
         "33",
         {
          "args": [
           "-7152705137269109576",
           "-4731551208718647956"
          ],
          "function": "Abstraction.__call__",
          "type_params": {
           "T": {
            "type": "Integer"
           },
           "U": {
            "params": {
             "T": {
              "type": "Integer"
             },
             "U": {
              "params": {
               "T": {
                "type": "Integer"
               },
               "U": {
                "type": "Integer"
               }
              },
              "type": "Abstraction"
             }
            },
            "type": "Abstraction"
           }
          }
         }
        ],
        "-8193178092949280445": [
         "2",
         {
          "repr": "fib_more",
          "type": "str"
         }
        ],
        "-8845129448963225019": [
         "30",
         {
          "args": [
           "-8193178092949280445",
           "-7152705137269109576"
          ],
          "function": "FunctionThree.create",
          "type_params": {
           "T": {
            "type": "Integer"
           },
           "U": {
            "type": "Integer"
           },
           "V": {
            "type": "Integer"
           },
           "X": {
            "type": "Integer"
           }
          }
         }
        ],
        "-9140641984181778535": [
         "29",
         {
          "args": [
           "8994880330752359122",
           "-5714035107427050833",
           "9169923438897672122"
          ],
          "function": "Boolean.if_"
         }
        ],
        "1174966279097855613": [
         "29",
         {
          "args": [
           "8994880330752359122",
           "3055348348534632136",
           "9169923438897672122"
          ],
          "function": "Boolean.if_"
         }
        ],
        "1675430266998100058": [
         "1",
         {
          "args": [
           "-8193178092949280445",
           "6995310973663508181"
          ],
          "function": "FunctionThree.create",
          "type_params": {
           "T": {
            "type": "Integer"
           },
           "U": {
            "type": "Integer"
           },
           "V": {
            "type": "Integer"
           },
           "X": {
            "type": "Integer"
           }
          }
         }
        ],
        "1699684935501189025": [
         "15",
         {
          "args": [
           "-5471402788872995603"
          ],
          "function": "Abstraction.create_variable",
          "type_params": {
           "T": {
            "type": "Integer"
           },
           "U": {
            "params": {
             "T": {
              "type": "Integer"
             },
             "U": {
              "type": "Integer"
             }
            },
            "type": "Abstraction"
           }
          }
         }
        ],
        "1768970622270494201": [
         "9",
         {
          "args": [
           "3502814111171659379",
           "-6930061660453938500"
          ],
          "function": "Abstraction.create",
          "type_params": {
           "T": {
            "type": "Integer"
           },
           "U": {
            "params": {
             "T": {
              "type": "Integer"
             },
             "U": {
              "params": {
               "T": {
                "type": "Integer"
               },
               "U": {
                "type": "Integer"
               }
              },
              "type": "Abstraction"
             }
            },
            "type": "Abstraction"
           }
          }
         }
        ],
        "222151100613706161": [
         "1",
         {
          "args": [
           "-8193178092949280445",
           "4641969144577051783"
          ],
          "function": "FunctionThree.create",
          "type_params": {
           "T": {
            "type": "Integer"
           },
           "U": {
            "type": "Integer"
           },
           "V": {
            "type": "Integer"
           },
           "X": {
            "type": "Integer"
           }
          }
         }
        ],
        "2229741321625012437": [
         "9",
         {
          "args": [
           "3502814111171659379",
           "7203027605948493738"
          ],
          "function": "Abstraction.create",
          "type_params": {
           "T": {
            "type": "Integer"
           },
           "U": {
            "params": {
             "T": {
              "type": "Integer"
             },
             "U": {
              "params": {
               "T": {
                "type": "Integer"
               },
               "U": {
                "type": "Integer"
               }
              },
              "type": "Abstraction"
             }
            },
            "type": "Abstraction"
           }
          }
         }
        ],
        "2827354755648773677": [
         "4",
         {
          "args": [
           "-7152705137269109576",
           "5381614128726372756"
          ],
          "function": "Abstraction.create",
          "type_params": {
           "T": {
            "params": {
             "T": {
              "type": "Integer"
             },
             "U": {
              "params": {
               "T": {
                "type": "Integer"
               },
               "U": {
                "params": {
                 "T": {
                  "type": "Integer"
                 },
                 "U": {
                  "type": "Integer"
                 }
                },
                "type": "Abstraction"
               }
              },
              "type": "Abstraction"
             }
            },
            "type": "Abstraction"
           },
           "U": {
            "params": {
             "T": {
              "type": "Integer"
             },
             "U": {
              "params": {
               "T": {
                "type": "Integer"
               },
               "U": {
                "params": {
                 "T": {
                  "type": "Integer"
                 },
                 "U": {
                  "type": "Integer"
                 }
                },
                "type": "Abstraction"
               }
              },
              "type": "Abstraction"
             }
            },
            "type": "Abstraction"
           }
          }
         }
        ],
        "3055348348534632136": [
         "26",
         {
          "args": [
           "-8845129448963225019",
           "-4731551208718647956",
           "-3083040421012505767",
           "8939703060706493622"
          ],
          "function": "FunctionThree.__call__",
          "type_params": {
           "T": {
            "type": "Integer"
           },
           "U": {
            "type": "Integer"
           },
           "V": {
            "type": "Integer"
           },
           "X": {
            "type": "Integer"
           }
          }
         }
        ],
        "3296152275149561154": [
         "1",
         {
          "args": [
           "-7409043239914570800"
          ],
          "function": "FunctionThree.from_fn_recursive"
         }
        ],
        "3502814111171659379": [
         "11",
         {
          "args": [
           "-5471402790375540303"
          ],
          "function": "Abstraction.create_variable",
          "type_params": {
           "T": {
            "type": "Integer"
           },
           "U": {
            "params": {
             "T": {
              "type": "Integer"
             },
             "U": {
              "params": {
               "T": {
                "type": "Integer"
               },
               "U": {
                "type": "Integer"
               }
              },
              "type": "Abstraction"
             }
            },
            "type": "Abstraction"
           }
          }
         }
        ],
        "3509919070533438821": [
         "1",
         {
          "args": [
           "-8193178092949280445",
           "-6566385289152139753"
          ],
          "function": "FunctionThree.create",
          "type_params": {
           "T": {
            "type": "Integer"
           },
           "U": {
            "type": "Integer"
           },
           "V": {
            "type": "Integer"
           },
           "X": {
            "type": "Integer"
           }
          }
         }
        ],
        "3751969246381808255": [
         "6",
         {
          "repr": "0x7f8f2083b828",
          "type": "Variable"
         }
        ],
        "3789502144356710760": [
         "1",
         {
          "args": [
           "-8193178092949280445",
           "-1537352240565790994"
          ],
          "function": "FunctionThree.create",
          "type_params": {
           "T": {
            "type": "Integer"
           },
           "U": {
            "type": "Integer"
           },
           "V": {
            "type": "Integer"
           },
           "X": {
            "type": "Integer"
           }
          }
         }
        ],
        "401312169678309198": [
         "34",
         {
          "args": [
           "-8126292564009571703",
           "-3083040421012505767"
          ],
          "function": "Abstraction.__call__",
          "type_params": {
           "T": {
            "type": "Integer"
           },
           "U": {
            "params": {
             "T": {
              "type": "Integer"
             },
             "U": {
              "type": "Integer"
             }
            },
            "type": "Abstraction"
           }
          }
         }
        ],
        "4056229352954758995": [
         "21",
         {
          "args": [
           "-2013152151157931125"
          ],
          "function": "Integer.from_int"
         }
        ],
        "4530898577098197965": [
         "17",
         {
          "args": [
           "-3083040421012505767",
           "1174966279097855613"
          ],
          "function": "Abstraction.create",
          "type_params": {
           "T": {
            "type": "Integer"
           },
           "U": {
            "type": "Integer"
           }
          }
         }
        ],
        "4641969144577051783": [
         "5",
         {
          "args": [
           "-4163701748216795396"
          ],
          "function": "Abstraction.fix"
         }
        ],
        "4843861630133928800": [
         "13",
         {
          "args": [
           "1699684935501189025",
           "9045839954054975984"
          ],
          "function": "Abstraction.create",
          "type_params": {
           "T": {
            "type": "Integer"
           },
           "U": {
            "params": {
             "T": {
              "type": "Integer"
             },
             "U": {
              "type": "Integer"
             }
            },
            "type": "Abstraction"
           }
          }
         }
        ],
        "5381614128726372756": [
         "9",
         {
          "args": [
           "3502814111171659379",
           "4843861630133928800"
          ],
          "function": "Abstraction.create",
          "type_params": {
           "T": {
            "type": "Integer"
           },
           "U": {
            "params": {
             "T": {
              "type": "Integer"
             },
             "U": {
              "params": {
               "T": {
                "type": "Integer"
               },
               "U": {
                "type": "Integer"
               }
              },
              "type": "Abstraction"
             }
            },
            "type": "Abstraction"
           }
          }
         }
        ],
        "555020173210289209": [
         "3",
         {
          "repr": "FunctionReplaceTyping(fn=<function FunctionThree.from_fn_recursive.<locals>.inner at 0x7f8f208176a8>, typevars={~V: <class 'metadsl_core.integer.Integer'>, ~U: <class 'metadsl_core.integer.Integer'>, ~T: <class 'metadsl_core.integer.Integer'>, ~X: <class 'metadsl_core.integer.Integer'>}, typevars_in_scope={~X, ~T, ~U, ~V})",
          "type": "FunctionReplaceTyping"
         }
        ],
        "555020299311461409": [
         "12",
         {
          "repr": "FunctionReplaceTyping(fn=<function FunctionThree.from_fn_recursive.<locals>.inner.<locals>.inner.<locals>.inner at 0x7f8f20817950>, typevars={~V: <class 'metadsl_core.integer.Integer'>, ~U: <class 'metadsl_core.integer.Integer'>, ~T: <class 'metadsl_core.integer.Integer'>, ~X: <class 'metadsl_core.integer.Integer'>}, typevars_in_scope={~X, ~U, ~V, ~T})",
          "type": "FunctionReplaceTyping"
         }
        ],
        "555020325300721609": [
         "8",
         {
          "repr": "FunctionReplaceTyping(fn=<function FunctionThree.from_fn_recursive.<locals>.inner.<locals>.inner at 0x7f8f100d9378>, typevars={~V: <class 'metadsl_core.integer.Integer'>, ~U: <class 'metadsl_core.integer.Integer'>, ~T: <class 'metadsl_core.integer.Integer'>, ~X: <class 'metadsl_core.integer.Integer'>}, typevars_in_scope={~X, ~T, ~U, ~V})",
          "type": "FunctionReplaceTyping"
         }
        ],
        "555020506385503609": [
         "16",
         {
          "repr": "FunctionReplaceTyping(fn=<function FunctionThree.from_fn_recursive.<locals>.inner.<locals>.inner.<locals>.inner.<locals>.inner at 0x7f8f208179d8>, typevars={~V: <class 'metadsl_core.integer.Integer'>, ~U: <class 'metadsl_core.integer.Integer'>, ~T: <class 'metadsl_core.integer.Integer'>, ~X: <class 'metadsl_core.integer.Integer'>}, typevars_in_scope={~X, ~U, ~V, ~T})",
          "type": "FunctionReplaceTyping"
         }
        ],
        "5805122527491742021": [
         "9",
         {
          "args": [
           "3502814111171659379",
           "-1904840065120623779"
          ],
          "function": "Abstraction.create",
          "type_params": {
           "T": {
            "type": "Integer"
           },
           "U": {
            "params": {
             "T": {
              "type": "Integer"
             },
             "U": {
              "params": {
               "T": {
                "type": "Integer"
               },
               "U": {
                "type": "Integer"
               }
              },
              "type": "Abstraction"
             }
            },
            "type": "Abstraction"
           }
          }
         }
        ],
        "5934196273650601297": [
         "5",
         {
          "args": [
           "-7311685910498514272"
          ],
          "function": "Abstraction.fix"
         }
        ],
        "6106182900721406189": [
         "33",
         {
          "args": [
           "-4126979823539692110",
           "-4731551208718647956"
          ],
          "function": "Abstraction.__call__",
          "type_params": {
           "T": {
            "type": "Integer"
           },
           "U": {
            "params": {
             "T": {
              "type": "Integer"
             },
             "U": {
              "params": {
               "T": {
                "type": "Integer"
               },
               "U": {
                "type": "Integer"
               }
              },
              "type": "Abstraction"
             }
            },
            "type": "Abstraction"
           }
          }
         }
        ],
        "6390614114613712341": [
         "27",
         {
          "args": [
           "3502814111171659379",
           "4056229352954758995"
          ],
          "function": "Integer.eq"
         }
        ],
        "6726888453725805922": [
         "17",
         {
          "args": [
           "555020506385503609"
          ],
          "function": "Abstraction.from_fn"
         }
        ],
        "6995310973663508181": [
         "5",
         {
          "args": [
           "-3395452948088348766"
          ],
          "function": "Abstraction.fix"
         }
        ],
        "7076053915067089843": [
         "26",
         {
          "args": [
           "401312169678309198",
           "8939703060706493622"
          ],
          "function": "Abstraction.__call__",
          "type_params": {
           "T": {
            "type": "Integer"
           },
           "U": {
            "type": "Integer"
           }
          }
         }
        ],
        "7203027605948493738": [
         "13",
         {
          "args": [
           "555020299311461409"
          ],
          "function": "Abstraction.from_fn"
         }
        ],
        "8545286856133305655": [
         "34",
         {
          "args": [
           "6106182900721406189",
           "-3083040421012505767"
          ],
          "function": "Abstraction.__call__",
          "type_params": {
           "T": {
            "type": "Integer"
           },
           "U": {
            "params": {
             "T": {
              "type": "Integer"
             },
             "U": {
              "type": "Integer"
             }
            },
            "type": "Abstraction"
           }
          }
         }
        ],
        "8939703060706493622": [
         "35",
         {
          "args": [
           "1699684935501189025",
           "-3083040421012505767"
          ],
          "function": "Integer.__add__"
         }
        ],
        "8994880330752359122": [
         "22",
         {
          "args": [
           "3502814111171659379",
           "4056229352954758995"
          ],
          "function": "Integer.__gt__"
         }
        ],
        "9045839954054975984": [
         "17",
         {
          "args": [
           "-3083040421012505767",
           "-9140641984181778535"
          ],
          "function": "Abstraction.create",
          "type_params": {
           "T": {
            "type": "Integer"
           },
           "U": {
            "type": "Integer"
           }
          }
         }
        ],
        "9169923438897672122": [
         "28",
         {
          "args": [
           "6390614114613712341",
           "-3083040421012505767",
           "1699684935501189025"
          ],
          "function": "Boolean.if_"
         }
        ],
        "938143784446051422": [
         "1",
         {
          "args": [
           "-8193178092949280445",
           "-7162770845206029801"
          ],
          "function": "FunctionThree.create",
          "type_params": {
           "T": {
            "type": "Integer"
           },
           "U": {
            "type": "Integer"
           },
           "V": {
            "type": "Integer"
           },
           "X": {
            "type": "Integer"
           }
          }
         }
        ],
        "992639792148027798": [
         "4",
         {
          "args": [
           "-7152705137269109576",
           "5805122527491742021"
          ],
          "function": "Abstraction.create",
          "type_params": {
           "T": {
            "params": {
             "T": {
              "type": "Integer"
             },
             "U": {
              "params": {
               "T": {
                "type": "Integer"
               },
               "U": {
                "params": {
                 "T": {
                  "type": "Integer"
                 },
                 "U": {
                  "type": "Integer"
                 }
                },
                "type": "Abstraction"
               }
              },
              "type": "Abstraction"
             }
            },
            "type": "Abstraction"
           },
           "U": {
            "params": {
             "T": {
              "type": "Integer"
             },
             "U": {
              "params": {
               "T": {
                "type": "Integer"
               },
               "U": {
                "params": {
                 "T": {
                  "type": "Integer"
                 },
                 "U": {
                  "type": "Integer"
                 }
                },
                "type": "Abstraction"
               }
              },
              "type": "Abstraction"
             }
            },
            "type": "Abstraction"
           }
          }
         }
        ]
       },
       "states": {
        "initial": "3296152275149561154",
        "states": [
         {
          "node": "1675430266998100058",
          "rule": "metadsl_core.function.FunctionThree.from_fn_recursive"
         },
         {
          "node": "3509919070533438821",
          "rule": "metadsl_core.abstraction.Abstraction.from_fn"
         },
         {
          "node": "-6993459051533019229",
          "rule": "metadsl_core.abstraction.Abstraction.from_fn"
         },
         {
          "node": "3789502144356710760",
          "rule": "metadsl_core.abstraction.Abstraction.from_fn"
         },
         {
          "node": "938143784446051422",
          "rule": "metadsl_core.abstraction.Abstraction.from_fn"
         },
         {
          "node": "-7669839280755447835",
          "rule": "metadsl_core.function.three_call"
         },
         {
          "node": "222151100613706161",
          "rule": "metadsl_core.function.three_abstraction"
         },
         {
          "label": "core",
          "node": "222151100613706161",
          "rule": ""
         }
        ]
       }
      },
      "text/plain": [
       "Typez(definitions=None, nodes={'-7409043239914570800': ['0', PrimitiveNode(type='function', repr='<function fib_more at 0x7f8f208177b8>')], '3296152275149561154': ['1', CallNode(function='FunctionThree.from_fn_recursive', type_params=None, args=['-7409043239914570800'], kwargs=None)], '-8193178092949280445': ['2', PrimitiveNode(type='str', repr='fib_more')], '555020173210289209': ['3', PrimitiveNode(type='FunctionReplaceTyping', repr=\"FunctionReplaceTyping(fn=<function FunctionThree.from_fn_recursive.<locals>.inner at 0x7f8f208176a8>, typevars={~V: <class 'metadsl_core.integer.Integer'>, ~U: <class 'metadsl_core.integer.Integer'>, ~T: <class 'metadsl_core.integer.Integer'>, ~X: <class 'metadsl_core.integer.Integer'>}, typevars_in_scope={~X, ~T, ~U, ~V})\")], '-3395452948088348766': ['4', CallNode(function='Abstraction.from_fn', type_params=None, args=['555020173210289209'], kwargs=None)], '6995310973663508181': ['5', CallNode(function='Abstraction.fix', type_params=None, args=['-3395452948088348766'], kwargs=None)], '1675430266998100058': ['1', CallNode(function='FunctionThree.create', type_params={'X': DeclaredTypeInstance(type='Integer', params=None), 'V': DeclaredTypeInstance(type='Integer', params=None), 'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}, args=['-8193178092949280445', '6995310973663508181'], kwargs=None)], '3751969246381808255': ['6', PrimitiveNode(type='Variable', repr='0x7f8f2083b828')], '-7152705137269109576': ['7', CallNode(function='Abstraction.create_variable', type_params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)})}, args=['3751969246381808255'], kwargs=None)], '555020325300721609': ['8', PrimitiveNode(type='FunctionReplaceTyping', repr=\"FunctionReplaceTyping(fn=<function FunctionThree.from_fn_recursive.<locals>.inner.<locals>.inner at 0x7f8f100d9378>, typevars={~V: <class 'metadsl_core.integer.Integer'>, ~U: <class 'metadsl_core.integer.Integer'>, ~T: <class 'metadsl_core.integer.Integer'>, ~X: <class 'metadsl_core.integer.Integer'>}, typevars_in_scope={~X, ~T, ~U, ~V})\")], '-4917315558697447310': ['9', CallNode(function='Abstraction.from_fn', type_params=None, args=['555020325300721609'], kwargs=None)], '-2007108132401662645': ['4', CallNode(function='Abstraction.create', type_params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)})}, args=['-7152705137269109576', '-4917315558697447310'], kwargs=None)], '-6566385289152139753': ['5', CallNode(function='Abstraction.fix', type_params=None, args=['-2007108132401662645'], kwargs=None)], '3509919070533438821': ['1', CallNode(function='FunctionThree.create', type_params={'X': DeclaredTypeInstance(type='Integer', params=None), 'V': DeclaredTypeInstance(type='Integer', params=None), 'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}, args=['-8193178092949280445', '-6566385289152139753'], kwargs=None)], '-5471402790375540303': ['10', PrimitiveNode(type='Variable', repr='0x7f8f2083b780')], '3502814111171659379': ['11', CallNode(function='Abstraction.create_variable', type_params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}, args=['-5471402790375540303'], kwargs=None)], '555020299311461409': ['12', PrimitiveNode(type='FunctionReplaceTyping', repr=\"FunctionReplaceTyping(fn=<function FunctionThree.from_fn_recursive.<locals>.inner.<locals>.inner.<locals>.inner at 0x7f8f20817950>, typevars={~V: <class 'metadsl_core.integer.Integer'>, ~U: <class 'metadsl_core.integer.Integer'>, ~T: <class 'metadsl_core.integer.Integer'>, ~X: <class 'metadsl_core.integer.Integer'>}, typevars_in_scope={~X, ~U, ~V, ~T})\")], '7203027605948493738': ['13', CallNode(function='Abstraction.from_fn', type_params=None, args=['555020299311461409'], kwargs=None)], '2229741321625012437': ['9', CallNode(function='Abstraction.create', type_params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}, args=['3502814111171659379', '7203027605948493738'], kwargs=None)], '-7311685910498514272': ['4', CallNode(function='Abstraction.create', type_params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)})}, args=['-7152705137269109576', '2229741321625012437'], kwargs=None)], '5934196273650601297': ['5', CallNode(function='Abstraction.fix', type_params=None, args=['-7311685910498514272'], kwargs=None)], '-6993459051533019229': ['1', CallNode(function='FunctionThree.create', type_params={'X': DeclaredTypeInstance(type='Integer', params=None), 'V': DeclaredTypeInstance(type='Integer', params=None), 'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}, args=['-8193178092949280445', '5934196273650601297'], kwargs=None)], '-5471402788872995603': ['14', PrimitiveNode(type='Variable', repr='0x7f8f20831cc0')], '1699684935501189025': ['15', CallNode(function='Abstraction.create_variable', type_params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}, args=['-5471402788872995603'], kwargs=None)], '555020506385503609': ['16', PrimitiveNode(type='FunctionReplaceTyping', repr=\"FunctionReplaceTyping(fn=<function FunctionThree.from_fn_recursive.<locals>.inner.<locals>.inner.<locals>.inner.<locals>.inner at 0x7f8f208179d8>, typevars={~V: <class 'metadsl_core.integer.Integer'>, ~U: <class 'metadsl_core.integer.Integer'>, ~T: <class 'metadsl_core.integer.Integer'>, ~X: <class 'metadsl_core.integer.Integer'>}, typevars_in_scope={~X, ~U, ~V, ~T})\")], '6726888453725805922': ['17', CallNode(function='Abstraction.from_fn', type_params=None, args=['555020506385503609'], kwargs=None)], '-1904840065120623779': ['13', CallNode(function='Abstraction.create', type_params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}, args=['1699684935501189025', '6726888453725805922'], kwargs=None)], '5805122527491742021': ['9', CallNode(function='Abstraction.create', type_params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}, args=['3502814111171659379', '-1904840065120623779'], kwargs=None)], '992639792148027798': ['4', CallNode(function='Abstraction.create', type_params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)})}, args=['-7152705137269109576', '5805122527491742021'], kwargs=None)], '-1537352240565790994': ['5', CallNode(function='Abstraction.fix', type_params=None, args=['992639792148027798'], kwargs=None)], '3789502144356710760': ['1', CallNode(function='FunctionThree.create', type_params={'X': DeclaredTypeInstance(type='Integer', params=None), 'V': DeclaredTypeInstance(type='Integer', params=None), 'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}, args=['-8193178092949280445', '-1537352240565790994'], kwargs=None)], '-5471402790356054853': ['18', PrimitiveNode(type='Variable', repr='0x7f8f2083b160')], '-3083040421012505767': ['19', CallNode(function='Abstraction.create_variable', type_params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}, args=['-5471402790356054853'], kwargs=None)], '-2013152151157931125': ['20', PrimitiveNode(type='int', repr='1')], '4056229352954758995': ['21', CallNode(function='Integer.from_int', type_params=None, args=['-2013152151157931125'], kwargs=None)], '8994880330752359122': ['22', CallNode(function='Integer.__gt__', type_params=None, args=['3502814111171659379', '4056229352954758995'], kwargs=None)], '-8845129448963225019': ['30', CallNode(function='FunctionThree.create', type_params={'X': DeclaredTypeInstance(type='Integer', params=None), 'V': DeclaredTypeInstance(type='Integer', params=None), 'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}, args=['-8193178092949280445', '-7152705137269109576'], kwargs=None)], '-4731551208718647956': ['32', CallNode(function='Integer.__sub__', type_params=None, args=['3502814111171659379', '4056229352954758995'], kwargs=None)], '8939703060706493622': ['35', CallNode(function='Integer.__add__', type_params=None, args=['1699684935501189025', '-3083040421012505767'], kwargs=None)], '3055348348534632136': ['26', CallNode(function='FunctionThree.__call__', type_params={'X': DeclaredTypeInstance(type='Integer', params=None), 'V': DeclaredTypeInstance(type='Integer', params=None), 'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}, args=['-8845129448963225019', '-4731551208718647956', '-3083040421012505767', '8939703060706493622'], kwargs=None)], '6390614114613712341': ['27', CallNode(function='Integer.eq', type_params=None, args=['3502814111171659379', '4056229352954758995'], kwargs=None)], '9169923438897672122': ['28', CallNode(function='Boolean.if_', type_params=None, args=['6390614114613712341', '-3083040421012505767', '1699684935501189025'], kwargs=None)], '1174966279097855613': ['29', CallNode(function='Boolean.if_', type_params=None, args=['8994880330752359122', '3055348348534632136', '9169923438897672122'], kwargs=None)], '4530898577098197965': ['17', CallNode(function='Abstraction.create', type_params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}, args=['-3083040421012505767', '1174966279097855613'], kwargs=None)], '-2301422722903098161': ['13', CallNode(function='Abstraction.create', type_params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}, args=['1699684935501189025', '4530898577098197965'], kwargs=None)], '-2269790757109902385': ['9', CallNode(function='Abstraction.create', type_params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}, args=['3502814111171659379', '-2301422722903098161'], kwargs=None)], '-7177137270141030066': ['4', CallNode(function='Abstraction.create', type_params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)})}, args=['-7152705137269109576', '-2269790757109902385'], kwargs=None)], '-7162770845206029801': ['5', CallNode(function='Abstraction.fix', type_params=None, args=['-7177137270141030066'], kwargs=None)], '938143784446051422': ['1', CallNode(function='FunctionThree.create', type_params={'X': DeclaredTypeInstance(type='Integer', params=None), 'V': DeclaredTypeInstance(type='Integer', params=None), 'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}, args=['-8193178092949280445', '-7162770845206029801'], kwargs=None)], '-4126979823539692110': ['31', CallNode(function='FunctionThree.abstraction', type_params={'X': DeclaredTypeInstance(type='Integer', params=None), 'V': DeclaredTypeInstance(type='Integer', params=None), 'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}, args=['-8845129448963225019'], kwargs=None)], '6106182900721406189': ['33', CallNode(function='Abstraction.__call__', type_params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}, args=['-4126979823539692110', '-4731551208718647956'], kwargs=None)], '8545286856133305655': ['34', CallNode(function='Abstraction.__call__', type_params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}, args=['6106182900721406189', '-3083040421012505767'], kwargs=None)], '-5714035107427050833': ['26', CallNode(function='Abstraction.__call__', type_params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}, args=['8545286856133305655', '8939703060706493622'], kwargs=None)], '-9140641984181778535': ['29', CallNode(function='Boolean.if_', type_params=None, args=['8994880330752359122', '-5714035107427050833', '9169923438897672122'], kwargs=None)], '9045839954054975984': ['17', CallNode(function='Abstraction.create', type_params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}, args=['-3083040421012505767', '-9140641984181778535'], kwargs=None)], '4843861630133928800': ['13', CallNode(function='Abstraction.create', type_params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}, args=['1699684935501189025', '9045839954054975984'], kwargs=None)], '5381614128726372756': ['9', CallNode(function='Abstraction.create', type_params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}, args=['3502814111171659379', '4843861630133928800'], kwargs=None)], '2827354755648773677': ['4', CallNode(function='Abstraction.create', type_params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)})}, args=['-7152705137269109576', '5381614128726372756'], kwargs=None)], '-3560659222398345834': ['5', CallNode(function='Abstraction.fix', type_params=None, args=['2827354755648773677'], kwargs=None)], '-7669839280755447835': ['1', CallNode(function='FunctionThree.create', type_params={'X': DeclaredTypeInstance(type='Integer', params=None), 'V': DeclaredTypeInstance(type='Integer', params=None), 'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}, args=['-8193178092949280445', '-3560659222398345834'], kwargs=None)], '-8126292564009571703': ['33', CallNode(function='Abstraction.__call__', type_params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}, args=['-7152705137269109576', '-4731551208718647956'], kwargs=None)], '401312169678309198': ['34', CallNode(function='Abstraction.__call__', type_params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}, args=['-8126292564009571703', '-3083040421012505767'], kwargs=None)], '7076053915067089843': ['26', CallNode(function='Abstraction.__call__', type_params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}, args=['401312169678309198', '8939703060706493622'], kwargs=None)], '-4260278360339551966': ['29', CallNode(function='Boolean.if_', type_params=None, args=['8994880330752359122', '7076053915067089843', '9169923438897672122'], kwargs=None)], '-5467468638471633527': ['17', CallNode(function='Abstraction.create', type_params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}, args=['-3083040421012505767', '-4260278360339551966'], kwargs=None)], '-6930061660453938500': ['13', CallNode(function='Abstraction.create', type_params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}, args=['1699684935501189025', '-5467468638471633527'], kwargs=None)], '1768970622270494201': ['9', CallNode(function='Abstraction.create', type_params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}, args=['3502814111171659379', '-6930061660453938500'], kwargs=None)], '-4163701748216795396': ['4', CallNode(function='Abstraction.create', type_params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Abstraction', params={'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)}), 'T': DeclaredTypeInstance(type='Integer', params=None)})}, args=['-7152705137269109576', '1768970622270494201'], kwargs=None)], '4641969144577051783': ['5', CallNode(function='Abstraction.fix', type_params=None, args=['-4163701748216795396'], kwargs=None)], '222151100613706161': ['1', CallNode(function='FunctionThree.create', type_params={'X': DeclaredTypeInstance(type='Integer', params=None), 'V': DeclaredTypeInstance(type='Integer', params=None), 'U': DeclaredTypeInstance(type='Integer', params=None), 'T': DeclaredTypeInstance(type='Integer', params=None)}, args=['-8193178092949280445', '4641969144577051783'], kwargs=None)]}, states=States(initial='3296152275149561154', states=[State(node='1675430266998100058', rule='metadsl_core.function.FunctionThree.from_fn_recursive', label=None), State(node='3509919070533438821', rule='metadsl_core.abstraction.Abstraction.from_fn', label=None), State(node='-6993459051533019229', rule='metadsl_core.abstraction.Abstraction.from_fn', label=None), State(node='3789502144356710760', rule='metadsl_core.abstraction.Abstraction.from_fn', label=None), State(node='938143784446051422', rule='metadsl_core.abstraction.Abstraction.from_fn', label=None), State(node='-7669839280755447835', rule='metadsl_core.function.three_call', label=None), State(node='222151100613706161', rule='metadsl_core.function.three_abstraction', label=None), State(node='222151100613706161', rule='', label='core')]))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fib_more"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
